package com.example.mysql.学习笔记.高级.事务.事务的基本知识;

public class 事务的隔离级别 {
}
/**
 * 3.事务隔离级别
 * MySQL是一个客户端/服务器架构的软件,对于同一个服务器来说，
 * 可以有若千个客户端与之连接,每个客户端与服务器连接上之后，就可以称为-个会话( Session)。
 * 每个客户端都可以在自己的会话中向服务器发出请求语句，
 * 一个请求语句可能是某个事务的一部分,也就是对于服务器来说可能同时处理多个事务。
 * 事务有隔离性的特性,理论上在某个事务对某个数据进行访问时，其他事务应该进行排队，
 * 当该事务提交之后，其他事务才可以继续访问这个数据。
 * 但是这样对性能影响太大，我们既想保持事务的隔离性，
 * 又想让服务器在处理访问同一数据的多个事务时性能尽量高些，那就看一者如何权衡取舍了。
 *
 */

/**
 * 1.脏写(Dirty Write)
 *  //一个事务修改了可能会回滚的数据(另一个数据进行修改但是回滚)
 * 对于两个事务Session A、Session B,
 * 如果事务Session A修改了另一个未提交事务Session B修改过的数据，
 * 那就意味着发生了脏写
 *
 * 2.脏读(Dirty Read )
 *  //一个事务读取了可能会回滚的数据(另一个数据进行修改但是回滚)
 * 对于两个务Session A、Session B,
 * SessionA 读取了已经被SessionB更新但还没有被提交的字段。
 * 之后若SessionB回滚，Session A读取的内容就是临时且无效的。
 *
 * 3.不可重复读( Non-Repeatable Read )
 *    //一个事务两次查询发现两次结果不一样（另一个事务发生了修改）
 * 对于两个事务Session A、Session B，
 * SessionA 读取了一个字段，然后SessionB更新了该字段。
 * 之后Session A 再次读取同一个字段，值就不同了。那就意味着发生了不可重复读。
 *
 * 4.幻读( Phantom )(一定是插入  删除是不可重复读)
 *    //一个事务两次查询发现多出来几条数据（另一个事务发生了插入）
 * 对于两个事务Session A、Session B,
 * Session A从一个表中读取了一个字段，然后Session B在该表中插入了一些新的行。
 * 之后，如果SessionA再次读取同一个表,就会多出几行。那就意味着发生了幻读。
 * 我们把新插入的那些记录称之为幻影记录
 *
 */

/**
 * 3.3 SQL中的四种隔离级别
 * 上面介绍了几种并发事务执行过程中可能遇到的一些问题，这些问题有轻重缓急之分，
 * 我们给这些问题按照严重性来排一下序:
 * 脏写>脏读>不可重复读>幻读
 *
 *
 * 我们愿意舍弃一部分隔离性来换取一部分性能在这里就体现在:
 * 设立一些隔离级别，隔离级别越低，并发问题发 生的就越多。
 * SQL标准 中设立了4个隔离级别:
 * ● READ UNCOMMITTED: 读未提交，
 *   在该隔离级别，所有事务都可以看到其他未提交事务的执行结果。
 *   不能避免脏读、不可重复读、幻读。
 * ● READ COMMITTED: 读已提交，它满足了隔离的简单定义:
 *   一个事务只能看见已经提交事务所做的改变。
 *   这是大多数数据库系统的默认隔离级别(但不是MySQL 默认的)。
 *   可以避免脏读,但不可重复读、幻读问题仍然存在。
 *   这是oracle的默认隔离级别。
 * ● REPEATABLE READ:可重复读,
 *   事务A在读到一条数据之后，此时事务B对该数据进行了修改并提交，
 *   那么事务A再读该数据，读到的还是原来的内容。
 *   可以避免脏读、不可重复读，但幻读问题仍然存在。
 *   这是MySQL的默认隔离级别。
 * ● SERIALIZABLE :可串行化，确保事务可以从一个表中读取相同的行。
 *   在这个事务持续期间，禁止其他事务对该表执行插入、更新和删除操作。
 *   所有的并发问题都可以避免，但性能十分低下。
 *   能避免脏读、不可重复读和幻读。
 *
 * oracle只支持 READ COMMITTED 和 SERIALIZABLE
 * MySQL都支持 但是 MySQL的 REPEATABLE READ 就可以解决幻读
 *
 */
/**
 * 3.4 MySQL支持的四种隔离级别
 * 不同的数据库厂商对SQL标准中规定的四种隔离级别支持不一样。
 * 比如，Oracle 就只支持READ COMMITTED (默认隔离级别)和SERIALIZABLE隔离级别。
 * MySQL 虽然支持4种隔离级别，但与SQL标准中所规定的各级隔离级别允许发生的问题却有些出入，
 * MySQL在REPEATABLE READ隔离级别下，是可以禁止幻读问题的发生的,
 * 禁止幻读的原因我们在第16章讲解。
 *
 * #查看隔离级别，MySQL 5.7 .20的版本之前:
 * mysql> SHOW VARIABLES LIKE‘tx_isolation';
 * #查看隔离级别，MySQL 5.7 .20的版本及之后:
 * mysql> SHOW VARIABLES LIKE 'transaction_isolation';
 *
 *
 * 3.5如何设置事务的隔离级别
 * 通过下面的语句修改事务的隔离级别:
 * SET [ GLOBAL(全球化) / SESSION(一场)] TRANSACTION ISOLATION LEVEL 隔离级别;
 * #其中，隔离级别格式:
 * READ UNCOMMITTED
 * READ COMMITTED
 * REPEATABLE READ
 * SERIALIZABLE
 * 或者:
 * SET [GLOBAL / SESSION] TRANSACTION_ISOLATION = '隔离级别';
 * #其中，隔离级别格式:
 * > READ-UNCOMMITTED
 * > READ-COMMITTED
 * > REPEATABLE-READ
 * > SERIALIZABLE
 *
 * GLOBAL(全球化):
 * 。当前已经存在的会话无效
 * 。只对执行完该语句之后产生的会话起作用
 * SESSION(一场):
 * 。对当前会话的所有后续的事务有效
 * 。如果在事务之间执行，则对后续的事务有效
 * 。该语句可以在已经开启的事务中间执行，但不会影响当前正在执行的事务
 *
 *
 *
 *
 */